#ifndef SWIIC_H_
#define SWIIC_H_

#include "stdint.h"

#ifdef __cplusplus
extern "C"
{
#endif

#ifndef IIC_ACK
#define IIC_ACK 0
#endif

#ifndef IIC_NACK
#define IIC_NACK 1
#endif

	typedef const struct
	{
		void (*sda_out_high)(void);
		void (*sda_out_low)(void);

		void (*scl_out_high)(void);
		void (*scl_out_low)(void);

		void (*scl_out_mode)(void);
		void (*sda_out_mode)(void);
		void (*sda_in_mode)(void);

		uint8_t (*sda_st_get)(void);
	} swiic_cfg_type;

	void sw_iic_init(swiic_cfg_type *iicobj);
	void sw_iic_start(swiic_cfg_type *iicobj);
	void sw_iic_stop(swiic_cfg_type *iicobj);
	void sw_iic_ack_send(swiic_cfg_type *iic, uint8_t a);

	uint8_t sw_iic_send_byte(swiic_cfg_type *iicobj, uint8_t c);
	uint8_t sw_iic_rcv_byte(swiic_cfg_type *iicobj);

	uint8_t sw_iic_chip_rcv_byte(swiic_cfg_type *iicobj, int8_t sla, uint8_t *c);
	uint8_t sw_iic_chip_send_byte(swiic_cfg_type *iicobj, uint8_t sla, uint8_t c);
	
	uint8_t sw_iic_chip_send_str(swiic_cfg_type *iicobj, uint8_t sla, uint8_t suba, uint8_t *s, uint8_t no);
	uint8_t sw_iic_chip_rcv_str(swiic_cfg_type *iicobj, uint8_t sla, uint8_t suba, uint8_t *s, uint8_t no);
	
	uint8_t sw_iic_chip2_send_str(swiic_cfg_type *iic, uint8_t sla, uint16_t suba, uint8_t *s, uint16_t no);
	uint8_t sw_iic_chip2_rcv_str(swiic_cfg_type *iic, uint8_t sla, uint16_t suba, uint8_t *s, uint16_t no);

	void sw_hiic_init(swiic_cfg_type *iicobj);
	void sw_hiic_start(swiic_cfg_type *iicobj);
	void sw_hiic_stop(swiic_cfg_type *iicobj);
	void sw_hiic_ack_send(swiic_cfg_type *iic, uint8_t a);

	uint8_t sw_hiic_send_byte(swiic_cfg_type *iicobj, uint8_t c);
	uint8_t sw_hiic_rcv_byte(swiic_cfg_type *iicobj);

	uint8_t sw_hiic_chip_rcv_byte(swiic_cfg_type *iicobj, int8_t sla, uint8_t *c);
	uint8_t sw_hiic_chip_send_byte(swiic_cfg_type *iicobj, uint8_t sla, uint8_t c);
	
	uint8_t sw_hiic_chip_send_str(swiic_cfg_type *iicobj, uint8_t sla, uint8_t suba, uint8_t *s, uint8_t no);
	uint8_t sw_hiic_chip_rcv_str(swiic_cfg_type *iicobj, uint8_t sla, uint8_t suba, uint8_t *s, uint8_t no);
	
	uint8_t sw_hiic_chip2_send_str(swiic_cfg_type *iic, uint8_t sla, uint16_t suba, uint8_t *s, uint16_t no);
	uint8_t sw_hiic_chip2_rcv_str(swiic_cfg_type *iic, uint8_t sla, uint16_t suba, uint8_t *s, uint16_t no);

#ifdef __cplusplus
}
#endif

#endif 
